﻿using Dlls;
using Persistencia;
using Servicos.Servico;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using UI.Views.Consultas;
using UI.Classes;

namespace UI.Views.Cadastros
{
    /// <summary>
    /// Interaction logic for frmCadastroFuncionarios.xaml
    /// </summary>
    public partial class frmCadastroFuncionarios : Window
    {
        private Funcionario funcionario;
        private FuncionarioDLL funcionarioDLL;
        private LocalTrabalhoDLL localtrabalhoDLL;
        private int CodigoAlterarOuDeletar = 0;
        private Basicos.Cep consultaCep;
        private Context contexto;
        private base_cep endereco;
        public List<base_cep> lista;
        private NivelInstrucaoDLL nivelInstrucaoDll;

        public frmCadastroFuncionarios(int codigo)
        {
            InitializeComponent();
            funcionarioDLL = new FuncionarioDLL();
            funcionario = new Funcionario();
            localtrabalhoDLL = new LocalTrabalhoDLL();
            contexto = new Context();
            consultaCep = new Basicos.Cep();
            lista = new List<base_cep>();
            nivelInstrucaoDll = new NivelInstrucaoDLL();

            txtDataCadastro.Text = DateTime.Now.ToString();
            txtDataCadastro.IsEnabled = false;
            cbxNivelInstrucao.ItemsSource = nivelInstrucaoDll.List().Select(o => o.Descricao.ToString());
            if (codigo != 0)
            {
                CodigoAlterarOuDeletar = codigo;
            }
        }

        private void InsertOrUpdate(object sender, RoutedEventArgs e)
        {
            try
            {
                if (txtCodigo.Text.ToString() != "")
                {
                    CodigoAlterarOuDeletar = int.Parse(txtCodigo.Text.ToString()); 
                    funcionario.Nome = txtNomeFuncionario.Text;
                    funcionario.AtivoSN = rbAtivo.IsChecked;
                    funcionario.CEP = int.Parse(txtCEP.Text);
                    funcionario.DataCadastro = Convert.ToDateTime(txtDataCadastro.Text);
                    funcionario.Logradouro = txtLogradouro.Text;
                    funcionario.Numero = txtNumero.Text;
                    funcionario.Cidade = txtCidade.Text;
                    funcionario.Bairro = txtBairro.Text;
                    funcionario.UF = txtUF.Text;
                    funcionario.PontoReferencia = txtPontoRef.Text;
                    funcionario.Email = txtEmail.Text;
                    funcionario.Telefone = txtTelefone.Text;
                    funcionario.Telefone2 = txtTelefone2.Text;
                    funcionario.CPF = txtCPF.Text;
                    funcionario.RG = txtRG.Text;
                    funcionario.CTPS = txtCTPS.Text;
                    funcionario.LocalTrabalho = int.Parse(txtCodLocalTrab.Text);
                    funcionario.Profissao = int.Parse(txtCodProfissao.Text);
                    funcionario.NivelInstrucao = nivelInstrucaoDll.GetCodigoPorNome(cbxNivelInstrucao.Text).Codigo;
                    if (CPFVALIDO())
                    {
                        funcionarioDLL.Update(CodigoAlterarOuDeletar, funcionario);
                        MessageBox.Show("Funcionario Atualizado com sucesso!");
                    }
                    else
                    {
                        MessageBox.Show("CPF inválido , favor verificar");
                    }
                }
                else
                {
                    
                    funcionario.Nome = txtNomeFuncionario.Text;
                    funcionario.AtivoSN = rbAtivo.IsChecked;
                    funcionario.CEP = int.Parse(txtCEP.Text);
                    funcionario.DataCadastro = Convert.ToDateTime(txtDataCadastro.Text);
                    funcionario.Logradouro = txtLogradouro.Text;
                    funcionario.Numero = txtNumero.Text;
                    funcionario.Cidade = txtCidade.Text;
                    funcionario.Bairro = txtBairro.Text;
                    funcionario.UF = txtUF.Text;
                    funcionario.PontoReferencia = txtPontoRef.Text;
                    funcionario.Email = txtEmail.Text;
                    funcionario.Telefone = txtTelefone.Text;
                    funcionario.Telefone2 = txtTelefone2.Text;
                    funcionario.CPF = txtCPF.Text;
                    funcionario.RG = txtRG.Text;
                    funcionario.CTPS = txtCTPS.Text;
                    funcionario.LocalTrabalho = int.Parse(txtCodLocalTrab.Text);
                    funcionario.Profissao = int.Parse(txtCodProfissao.Text);
                    funcionario.NivelInstrucao = nivelInstrucaoDll.GetCodigoPorNome(cbxNivelInstrucao.Text).Codigo;
                    if (CPFVALIDO())
                    {
                        funcionarioDLL.Insert(funcionario);
                        MessageBox.Show("Funcionario Cadastrado com sucesso!");
                    }
                    else
                    {
                        MessageBox.Show("CPF inválido , favor verificar");                    
                    }
                    
                }
                LimpaCampos.reset(0, this);
            }
            catch
            {
                MessageBox.Show("Registro não pode ser gravador/alterado favor verificar os campos");
            }

        }

        public bool CPFVALIDO()
        {
            bool valido;
            valido = ValidaCPF.IsCpf(txtCPF.Text); 
            return valido;
        }

        private void ListarSetores(object sender, KeyEventArgs e)
        {
            try
            {    
            if (e.Key == Key.Enter)
            {
                if (txtCodLocalTrab.Text.ToString() == "")
                {
                    global.ReturnLocalTrabalho = null;
                    new frmConsultaPadrao("Locais de Trabalho").ShowDialog();
                    if (global.ReturnLocalTrabalho != null)
                    {
                        txtCodLocalTrab.Text = global.ReturnLocalTrabalho.Codigo.ToString();
                        txtNomeLocal.Text = global.ReturnLocalTrabalho.Setor.ToString();
                    }
                }
                else
                {
                    LocalTrabalho localtrabalho = localtrabalhoDLL.getLocaTrabalho(int.Parse(txtCodLocalTrab.Text));
                    if (localtrabalho != null)
                    {
                        txtCodLocalTrab.Text = localtrabalho.Codigo.ToString();
                        txtNomeLocal.Text = localtrabalho.Setor.ToString();
                    }
                }
            }
            }
            catch (Exception)
            {

                MessageBox.Show("Não foi possivel obter os dados, favor verificar a conexão com o servidor de banco de dados");
            }
        }

        private void Editar(object sender, KeyEventArgs e)
        {
            try
            {

            if (e.Key == Key.Enter)
            {
                if (txtCodigo.Text.ToString() == "")
                {
                    frmConsultaPadrao frm = new frmConsultaPadrao("Funcionarios");
                    frm.Owner = this;
                    frm.ShowDialog();
                }
                else
                {
                    Funcionario item = funcionarioDLL.getFuncionario(int.Parse(txtCodigo.Text));
                    if (item != null)
                    {
                        txtCodigo.Text = item.Codigo.ToString();
                        txtNomeFuncionario.Text = item.Nome.ToString();
                        rbAtivo.IsChecked = item.AtivoSN;
                        txtCEP.Text = item.CEP.ToString();
                        txtDataCadastro.Text = item.DataCadastro.ToString();
                        txtLogradouro.Text = item.Logradouro.ToString();
                        txtBairro.Text = item.Bairro.ToString();
                        txtNumero.Text = item.Numero.ToString();
                        txtCidade.Text = item.Cidade.ToString();
                        txtUF.Text = item.UF.ToString();
                        txtPontoRef.Text = item.PontoReferencia.ToString();
                        txtEmail.Text = item.Email.ToString();
                        txtTelefone.Text = item.Telefone.ToString();
                        txtTelefone2.Text = item.Telefone2.ToString();
                        txtCPF.Text = item.CPF.ToString();
                        txtRG.Text = item.RG.ToString();
                        txtCTPS.Text = item.CTPS.ToString();
                        txtCodLocalTrab.Text = item.LocalTrabalho.ToString();
                        txtCodProfissao.Text = item.Profissao.ToString();
                        cbxNivelInstrucao.Text = nivelInstrucaoDll.getNivel(int.Parse(item.NivelInstrucao.ToString())).Descricao;
                    }
                    else
                    {
                        MessageBox.Show("Registro não encontrado , favor verificar");
                    }
                }
            }

            }
            catch (Exception)
            {

                MessageBox.Show("Erro ao selecionar registros , favor fechar o sistema");
            }
        }

        private void Novo(object sender, RoutedEventArgs e)
        {
            LimpaCampos.reset(0,this);
        }

        private void Excluir(object sender, RoutedEventArgs e)
        {
            try
            {
                if (txtCodigo.Text!="")
                {
                    funcionarioDLL.Delete(int.Parse(txtCodigo.Text));
                    MessageBox.Show("Registro Excluido");
                    LimpaCampos.reset(0, this);
                }
                else
                {
                    MessageBox.Show("Selecione um registro para excluir");
                }

            }
            catch (Exception )
            {
                
                MessageBox.Show("Não foi possivel excluir o registro, este pode estar associado ");
            }
        }
    }
}
